package com.zx.security.common.model;

import com.alibaba.fastjson2.annotation.JSONField;
import com.zx.core.enums.StatusEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * <p>
 * description: 登录用户信息 <br>
 * create: 2024-08-18 14:56
 * </p>
 *
 * @author zhou  xun
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
public class LoginUser implements UserDetails {
    /**
     * 唯一id
     */
    private String id;

    /**
     * 用户名
     */
    private String username;

    /**
     * 用户密码
     */
    private String password;

    /**
     * 角色列表
     */
    private Set<String> roles;

    /**
     * 权限列表
     */
    private Set<String> permissions;

    /**
     * 帐号状态(0停用 1启用)
     */
    private Integer status;

    /**
     * 租户ID
     */
    private String tenantId;

    /**
     * 租户名称
     */
    private String tenantName;

    /**
     * 返回授予用户的权限
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        if (permissions != null && !permissions.isEmpty()) {
            return permissions.stream()
                    .filter(permission -> permission != null && !permission.trim().isEmpty())
                    .map(SimpleGrantedAuthority::new)
                    .collect(Collectors.toSet());
        }
        return null;
    }

    @JSONField(serialize = false)
    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    /**
     * 从界面：
     * UserDetails 指示用户的帐户是否已过期。过期的帐户无法进行身份验证。
     * 指定者：
     * isAccountNonExpired 在界面中 UserDetails
     *
     * @return true 如果用户的帐户有效（即未过期）， false 如果不再有效（即已过期）
     */
    @JSONField(serialize = false)
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    /**
     * 从界面：
     * UserDetails 指示用户是已锁定还是已解锁。无法对锁定的用户进行身份验证。
     * 指定者：
     * isAccountNonLocked 在界面中 UserDetails
     *
     * @return true 如果用户未锁定
     */
    @JSONField(serialize = false)
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    /**
     * 从界面：
     * UserDetails 指示用户的凭据（密码）是否已过期。过期的凭据会阻止身份验证。
     * 指定者：
     * isCredentialsNonExpired 在界面中 UserDetails
     *
     * @return true 如果用户的凭据有效（即未过期）， false 如果不再有效（即已过期
     */
    @JSONField(serialize = false)
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    /**
     * 指示用户是启用还是禁用。无法对禁用的用户进行身份验证
     *
     * @return true 如果用户已启
     */
    @JSONField(serialize = false)
    @Override
    public boolean isEnabled() {
        StatusEnum statusEnum = StatusEnum.getEnumByCode(status);

        if (null == statusEnum) {
            return false;
        }

        if (statusEnum == StatusEnum.ENABLE) {
            return true;
        }

        return false;
    }

}